在本步骤中,使用 Kanzi Engine API 加载在您在本教程的上一步骤中在 Kanzi 应用程序中创建的地区包。
在本节中,您将使用 Kanzi Engine API 加载您在上一节创建的地区包。应用程序在启动时加载地区包,并触发加载存储在 <KanziWorkspace>/Projects/<ProjectName>/Application/bin/Locale_packs 目录中的所有地区的地区包。
要加载地区包:
ja-JP ko-KR zh-ZH
如果您在 Visual Studio 2017 中打开教程解决方案,遇到提示您重新定位工程到最新的 Microsoft 工具集时,请点击取消 (Cancel)。
要从 Kanzi Studio 打开 Kanzi Studio 工程的目录,选择 > 在 Windows 资源管理器中打开 (Open in Windows Explorer)。
DynamicPropertyType 并使用 Kanzi Studio 工程中使用的相同名称。class LocalizationApplication : public ExampleApplication
{
//在 Kanzi Studio 工程中定义的自定义属性类型的共享指针类型。
typedef shared_ptr<DynamicPropertyType<string> > StringDynamicPropertyTypeSharedPtr;onProjectLoaded 函数的 LocalizationApplication 类中实现事件处理程序,为存储在Locale_packs目录中的地区包 kzb 文件加载资源,并将地区添加到工程中。
//设置存储地区包的目录的名称。
static const string localizationFolderName = "Locale_packs";
//获取 kzb 文件中的屏幕 (Screen) 节点。您可以使用屏幕 (Screen) 节点访问 kzb 文件中的所有其他节点和资源。
ScreenSharedPtr screen = getScreen();
//域是所有子系统的集合,包含 Kanzi 资源管理器。您需要让资源管理器访问 kzb 文件中的资源。
ResourceManager* resourceManager = getDomain()->getResourceManager();
//获取含地区选择按钮的LocaleSelector 节点。
// 使用 # 符号后跟别名名称访问别名目标节点。
Node2DSharedPtr localeSelector = screen->lookupNode<Node2D>("#LocaleSelector");
//获取用于设置地区的按钮的 LocaleButton 预制模板。
//使用 kzb URL 获取对模板的参考。
// 您使用完整的 kzb 资源路径时,路径以 kzb:// 开头,后跟工程名称和资源位置。
PrefabTemplateSharedPtr localeButtonPrefab = resourceManager->acquireResource<PrefabTemplate>("kzb://localization/Prefabs/LocaleButton");
//获取自定义属性类型以设置
// LocaleButton 节点中的地区的名称。您在 Kanzi Studio 工程中创建了自定义属性类型。
StringDynamicPropertyTypeSharedPtr localeNameProperty = StringDynamicPropertyTypeSharedPtr(new DynamicPropertyType<string>("Localization.LocaleName"));
//获取自定义属性类型以设置应用程序中的地区。
//您在 Kanzi Studio 工程中创建了自定义属性类型。
StringDynamicPropertyTypeSharedPtr localeIdProperty = StringDynamicPropertyTypeSharedPtr(new DynamicPropertyType<string>("Localization.LocaleID"));
//读取包含//有地区包的 kzb 文件列表的 binaries.cfg 文件。
string configFileName = localizationFolderName + "/binaries.cfg";
ReadOnlyDiskFile binariesConfigFile(configFileName);
string binariesConfigContents = readAsText(binariesConfigFile);
stringstream binariesConfigFileStream(binariesConfigContents);
string localeId;
//加载存储在地区包 kzb 文件中的资源。
while (getline(binariesConfigFileStream, localeId))
{
trim(localeId);
//创建 kzb 文件路径。
string localizationKzbFilePath = localizationFolderName + "/" + localeId + ".kzb";
//将 kzb 文件添加到 Kanzi 资源管理器。
getResourceManager()->addKzbFile(localizationKzbFilePath);
string dictionaryUrl = "kzb://localization/Locales/" + localeId;
ResourceDictionarySharedPtr localeDictionary = getResourceManager()->acquireResource<ResourceDictionary>(dictionaryUrl);
//实例化 LocaleButton 预设件。
Node2DSharedPtr localeButton = localeButtonPrefab->instantiate<Node2D>("LocaleButton_" + localeId);
//从存储在地区包中的地区表中的资源 ID LocaleDisplayName //获取显示在应用程序中的地区的名称。
TextResourceSharedPtr localeDisplayNameResource = localeDictionary->acquire<TextResource>(ResourceID("LocaleDisplayName"));
//设置 LocaleName 属性,使按钮中的 Text Block 2D 节点显示地区的名称。
localeButton->setProperty(*localeNameProperty, localeDisplayNameResource->getText());
//设置 LocaleID 属性,您点击按钮时应用程序更改为该地区。
localeButton->setProperty(*localeIdProperty, localeId);
//设置按钮中 Text Block 2D 节点的样式,为
//地区的 LocaleDisplayName 设置正确的字体。
//使用这种方法仅应用地区包中的样式而不改变应用程序中的地区
//。
optional<string> localeStyle = localeDictionary->find(ResourceID("LocaleStyle"));
StyleSharedPtr style = getResourceManager()->acquireResource<Style>(*localeStyle);
localeButton->setStyle(style);
//将 LocaleButton 节点添加到 LocaleSelector 节点。
localeSelector->addChild(localeButton);
}

在应用程序中 Kanzi 从 binaries.cfg 文件中列出的文件 kzb 文件中加载地区包,并在 LocaleSelector 节点中为每个地区实例化一个LocaleButton 预设件。
在本教程中,您学习了如何本地化 Kanzi 应用程序,并在您的应用程序中使用仅包含本地化资源的其他 kzb 文件。要进一步学习本教程,您可以使用本地化表 .pot 模板将 Kanzi 应用程序的内容翻译到其他语言。另外,您可以创建其他资源类型,并为不同的地区创建不同的资源。例如,创建几个动画并各用于不同的地区:
要详细了解有关如何本地化您的 Kanzi 应用程序的信息,请参阅本地化。
要详细了解有关 kzb 文件的信息,请参阅使用 kzb 文件。
要了解有关 Kanzi 如何处理资源的信息,请参阅资源管理。
要详细了解有关如何使用资源字典的信息,请参阅资源。
要详细了解有关如何使用应用程序中字体的信息,请参阅导入字体。
要详细了解有关如何使用应用程序中状态机的信息,请参阅使用状态机。
要详细了解有关管理Kanzi Studio工程的信息,请参阅工程。
要了解创建Kanzi 应用程序的更多信息,请参阅教程。
要了解有关 Kanzi Studio 功能的更多信息,请参阅使用 ...。